package es.uned.etsii.si3.taller;

import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.field.DatabaseField;
import java.sql.SQLException;
import java.util.List;
import java.util.ArrayList;

public class VehiculoUsuario extends Persistente {
	public static final String ID_USUARIO_FIELD_NAME = "id_usuario";
	public static final String ID_VEHICULO_FIELD_NAME = "id_vehiculo";

	@DatabaseField(generatedId = true)
	int id;
	@DatabaseField(foreign = true, maxForeignAutoRefreshLevel=5, foreignAutoRefresh=true, columnName = ID_USUARIO_FIELD_NAME)
	Usuario usuario;
	@DatabaseField(foreign = true, maxForeignAutoRefreshLevel=5, foreignAutoRefresh=true, columnName = ID_VEHICULO_FIELD_NAME)
	Vehiculo vehiculo;

	/**
	 * Permite buscar el usuario al que pertenece un vehículo
	 * @param vehiculo
	 * @return el objeto buscado
	 * @throws SQLException
	 */
	public
	static List<Usuario> buscarUsuariosPorVehiculo(Vehiculo vehiculo) throws SQLException {
		Dao<VehiculoUsuario, Integer> dao = getClassDao(VehiculoUsuario.class);
		List<Usuario> resultado = new ArrayList<Usuario>();

		for(VehiculoUsuario vu : dao.queryForEq(ID_VEHICULO_FIELD_NAME, vehiculo))
			resultado.add(vu.getUsuario());

		return resultado;
	}

	/**
	 * Permite buscar qué vehículos pertenecen a un usuario
	 * @param usuario
	 * @return el objeto buscado
	 * @throws SQLException
	 */
	public
	static List<Vehiculo> buscarVehiculosPorUsuario(Usuario usuario) throws SQLException {
		Dao<VehiculoUsuario, Integer> dao = getClassDao(VehiculoUsuario.class);
		List<Vehiculo> resultado = new ArrayList<Vehiculo>();

		for(VehiculoUsuario vu : dao.queryForEq(ID_USUARIO_FIELD_NAME, usuario))
			resultado.add(vu.getVehiculo());

		return resultado;
	}

	/**
	 * Permite crear una asociación entre un vehículo y un usuario
	 * @param vehiculo
	 * @param usuario
	 * @return el objeto creado
	 * @throws SQLException
	 */
	public
	static VehiculoUsuario crear(Vehiculo vehiculo, Usuario usuario) throws SQLException {
		VehiculoUsuario vehiculoUsuario = new VehiculoUsuario();

		vehiculoUsuario.setVehiculo(vehiculo);
		vehiculoUsuario.setUsuario(usuario);
		getClassDao(VehiculoUsuario.class).create(vehiculoUsuario);

		return vehiculoUsuario;
	}

	public
	VehiculoUsuario() {
		// ORM Lite necesita un constructor por defecto
	}

	public int      getId()       { return id; }
	public Usuario  getUsuario()  { return usuario; }
	public Vehiculo getVehiculo() { return vehiculo; }

	public
	void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public
	void setVehiculo(Vehiculo vehiculo) {
		this.vehiculo = vehiculo;
	}
}